package vista;

import atributos.Atributo;
import atributos.ManagerAtributos;
import estadosistema.Mensajes;
import estadosistema.Nodos;
import exclusionmutua.Token;
import exclusionmutua.TokenListener;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;

import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.table.DefaultTableModel;
import java.util.List;
import java.util.Map;
import java.util.Set;
import javax.swing.JButton;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.table.TableColumn;
import jxta.CrearInputPipe;
import jxta.ManagerJXTA;
import net.jxta.platform.NetworkManager.ConfigMode;
import net.jxta.protocol.PipeAdvertisement;
import utilidades.ConsultaAdvertisement;
import vista.ApplicationLauncher;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/*
 * Inicio.java
 *
 * Created on 20/02/2011, 11:25:26 PM
 */
/**
 *
 * @author kastillo
 */
public class Inicio extends javax.swing.JFrame implements Runnable {

    //Atributos
    private ManagerJXTA jxta;
    final static int TIMEOUT = 4000;
    public final static String PATH = "C:\\jxta";
    public final static String RUTA_VIDEO = "C:/jxta/video/";
    public final static String RUTA_AUDIO = "C:/jxta/audio/";
    public final static String RUTA_TEXTO = "C:/jxta/texto/";
    public static String RUTA_EM = "C:/EM/";
    public static String RUTA_DEVUELTOS_EM = "C:/EMDevueltos/";
    private ArrayList<Atributo> propiedades;
    private ManagerAtributos manager;
    private boolean estadoDir = false;
    private ArrayList<Atributo> resultados = new ArrayList<Atributo>();
    public static ArrayList<Atributo> recursosCompartidos = new ArrayList<Atributo>();
    private String nombrePeer;
    private String nombreInstancia;
    private ArrayList<Nodos> nodos = new ArrayList<Nodos>();
    /** Creates new form Inicio */
    public Inicio() {
        initComponents();

        //(new Thread(this)).start();
    }

    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">//GEN-BEGIN:initComponents
    private void initComponents() {

        jTabbedPane1 = new javax.swing.JTabbedPane();
        jPanel1 = new javax.swing.JPanel();
        BotonIniciar = new javax.swing.JButton();
        jScrollPane2 = new javax.swing.JScrollPane();
        TextLog = new javax.swing.JTextArea();
        TextoNombrePeer = new javax.swing.JTextField();
        jLabel4 = new javax.swing.JLabel();
        jScrollPane5 = new javax.swing.JScrollPane();
        jTextArea1 = new javax.swing.JTextArea();
        jButton1 = new javax.swing.JButton();
        jPanel4 = new javax.swing.JPanel();
        jScrollPane3 = new javax.swing.JScrollPane();
        TablaArchivos = new javax.swing.JTable();
        BotonGuardarCambios = new javax.swing.JButton();
        BotonAbrirArchivo = new javax.swing.JButton();
        BottonEditarTabla = new javax.swing.JButton();
        jPanel2 = new javax.swing.JPanel();
        BotonBuscarPeer = new javax.swing.JButton();
        jScrollPane1 = new javax.swing.JScrollPane();
        TextPeer = new javax.swing.JTextArea();
        BotonStop = new javax.swing.JButton();
        jPanel5 = new javax.swing.JPanel();
        BotonBuscar = new javax.swing.JButton();
        TextoBuscarArchivoPorID = new javax.swing.JTextField();
        jLabel1 = new javax.swing.JLabel();
        jLabel2 = new javax.swing.JLabel();
        TextoBuscarArchivoPorContenido = new javax.swing.JTextField();
        BotonBuscarArchivoPorContenido = new javax.swing.JButton();
        jLabel3 = new javax.swing.JLabel();
        TextoBuscarPorMasParecido = new javax.swing.JTextField();
        BotonBuscarPorTamanio = new javax.swing.JButton();
        jScrollPane4 = new javax.swing.JScrollPane();
        TablaBusqueda = new javax.swing.JTable();
        BotonDescargarArchivo = new javax.swing.JButton();
        BotonPararBusqueda = new javax.swing.JButton();
        jPanel3 = new javax.swing.JPanel();
        jScrollPane6 = new javax.swing.JScrollPane();
        TablaRecursosCompartidos = new javax.swing.JTable();
        BotonActualizar = new javax.swing.JButton();
        botonSolicitarAbrir = new javax.swing.JButton();
        botonLiberar = new javax.swing.JButton();
        jPanel6 = new javax.swing.JPanel();
        jScrollPane7 = new javax.swing.JScrollPane();
        TablaEstadoGlobal = new javax.swing.JTable();
        botonEstadoGlobal = new javax.swing.JButton();
        BotonActualizarEstado = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);
        setTitle("JXTA");

        BotonIniciar.setText("Iniciar");
        BotonIniciar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonIniciarActionPerformed(evt);
            }
        });

        TextLog.setColumns(20);
        TextLog.setRows(5);
        jScrollPane2.setViewportView(TextLog);

        TextoNombrePeer.setHorizontalAlignment(javax.swing.JTextField.TRAILING);
        TextoNombrePeer.setText("Windows1");

        jLabel4.setText("log");

        jTextArea1.setColumns(20);
        jTextArea1.setRows(5);
        jScrollPane5.setViewportView(jTextArea1);

        jButton1.setText("Boton Prueba");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel1Layout = new javax.swing.GroupLayout(jPanel1);
        jPanel1.setLayout(jPanel1Layout);
        jPanel1Layout.setHorizontalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(18, 18, 18)
                        .addComponent(jLabel4))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING, false)
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addGap(19, 19, 19)
                                .addComponent(TextoNombrePeer, javax.swing.GroupLayout.PREFERRED_SIZE, 104, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addGap(34, 34, 34)
                                .addComponent(BotonIniciar, javax.swing.GroupLayout.PREFERRED_SIZE, 74, javax.swing.GroupLayout.PREFERRED_SIZE)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                                .addComponent(jButton1))
                            .addGroup(javax.swing.GroupLayout.Alignment.LEADING, jPanel1Layout.createSequentialGroup()
                                .addContainerGap()
                                .addComponent(jScrollPane2, javax.swing.GroupLayout.PREFERRED_SIZE, 349, javax.swing.GroupLayout.PREFERRED_SIZE)))
                        .addGap(120, 120, 120)
                        .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(313, Short.MAX_VALUE))
        );
        jPanel1Layout.setVerticalGroup(
            jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel1Layout.createSequentialGroup()
                .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addGap(22, 22, 22)
                        .addGroup(jPanel1Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(TextoNombrePeer, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(BotonIniciar, javax.swing.GroupLayout.PREFERRED_SIZE, 32, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jButton1)))
                    .addGroup(jPanel1Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane5, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addComponent(jScrollPane2, javax.swing.GroupLayout.DEFAULT_SIZE, 99, Short.MAX_VALUE)
                .addGap(18, 18, 18)
                .addComponent(jLabel4)
                .addGap(25, 25, 25))
        );

        jTabbedPane1.addTab("Conectar", jPanel1);

        TablaArchivos.setAutoCreateRowSorter(true);
        TablaArchivos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null}
            },
            new String [] {
                "Id", "Nombre Complet", "Nombre", "Extensión", "Tamaño", "Fecha de Modifiación", "Fecha de Creación", "Fecha de Último Acceso", "Ruta", "Palabras Claves"
            }
        ) {
            boolean[] canEdit = new boolean [] {
                false, false, false, true, true, false, false, false, false, true
            };

            public boolean isCellEditable(int rowIndex, int columnIndex) {
                return canEdit [columnIndex];
            }
        });
        TablaArchivos.setToolTipText("Archivos Compartirdos");
        TablaArchivos.setEnabled(false);
        TablaArchivos.addMouseListener(new java.awt.event.MouseAdapter() {
            public void mouseClicked(java.awt.event.MouseEvent evt) {
                TablaArchivosMouseClicked(evt);
            }
            public void mouseEntered(java.awt.event.MouseEvent evt) {
                TablaArchivosMouseEntered(evt);
            }
        });
        TablaArchivos.addFocusListener(new java.awt.event.FocusAdapter() {
            public void focusGained(java.awt.event.FocusEvent evt) {
                TablaArchivosFocusGained(evt);
            }
        });
        TablaArchivos.addInputMethodListener(new java.awt.event.InputMethodListener() {
            public void caretPositionChanged(java.awt.event.InputMethodEvent evt) {
            }
            public void inputMethodTextChanged(java.awt.event.InputMethodEvent evt) {
                TablaArchivosInputMethodTextChanged(evt);
            }
        });
        TablaArchivos.addKeyListener(new java.awt.event.KeyAdapter() {
            public void keyPressed(java.awt.event.KeyEvent evt) {
                TablaArchivosKeyPressed(evt);
            }
        });
        jScrollPane3.setViewportView(TablaArchivos);
        TablaArchivos.getColumnModel().getColumn(9).setMaxWidth(1000);

        BotonGuardarCambios.setText("Guardar");
        BotonGuardarCambios.setEnabled(false);
        BotonGuardarCambios.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonGuardarCambiosActionPerformed(evt);
            }
        });

        BotonAbrirArchivo.setText("Abrir");
        BotonAbrirArchivo.setEnabled(false);
        BotonAbrirArchivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonAbrirArchivoActionPerformed(evt);
            }
        });

        BottonEditarTabla.setText("Editar Palabras Claves");
        BottonEditarTabla.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BottonEditarTablaActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel4Layout = new javax.swing.GroupLayout(jPanel4);
        jPanel4.setLayout(jPanel4Layout);
        jPanel4Layout.setHorizontalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel4Layout.createSequentialGroup()
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel4Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 928, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel4Layout.createSequentialGroup()
                        .addGap(500, 500, 500)
                        .addComponent(BottonEditarTabla)
                        .addGap(35, 35, 35)
                        .addComponent(BotonGuardarCambios, javax.swing.GroupLayout.PREFERRED_SIZE, 102, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED, 106, Short.MAX_VALUE)
                        .addComponent(BotonAbrirArchivo)))
                .addContainerGap(17, Short.MAX_VALUE))
        );
        jPanel4Layout.setVerticalGroup(
            jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel4Layout.createSequentialGroup()
                .addContainerGap(34, Short.MAX_VALUE)
                .addComponent(jScrollPane3, javax.swing.GroupLayout.PREFERRED_SIZE, 190, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                .addGroup(jPanel4Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING, false)
                    .addComponent(BottonEditarTabla, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                    .addComponent(BotonGuardarCambios, javax.swing.GroupLayout.DEFAULT_SIZE, 23, Short.MAX_VALUE)
                    .addComponent(BotonAbrirArchivo, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
                .addContainerGap())
        );

        jTabbedPane1.addTab("Archivos Compartidos", jPanel4);

        BotonBuscarPeer.setText("Buscar Peer");
        BotonBuscarPeer.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonBuscarPeerActionPerformed(evt);
            }
        });

        TextPeer.setColumns(20);
        TextPeer.setRows(5);
        jScrollPane1.setViewportView(TextPeer);

        BotonStop.setText("Stop");
        BotonStop.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonStopActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel2Layout = new javax.swing.GroupLayout(jPanel2);
        jPanel2.setLayout(jPanel2Layout);
        jPanel2Layout.setHorizontalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 210, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addGap(18, 18, 18)
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addComponent(BotonBuscarPeer)
                    .addComponent(BotonStop))
                .addGap(1199, 1199, 1199))
        );
        jPanel2Layout.setVerticalGroup(
            jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel2Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel2Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel2Layout.createSequentialGroup()
                        .addComponent(BotonBuscarPeer)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(BotonStop))
                    .addComponent(jScrollPane1, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                .addContainerGap(162, Short.MAX_VALUE))
        );

        jTabbedPane1.addTab("Buscar Peer", jPanel2);

        BotonBuscar.setText("Buscar");
        BotonBuscar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonBuscarActionPerformed(evt);
            }
        });

        jLabel1.setText("Busqueda Por Id");

        jLabel2.setText("Busqueda por contenido");

        BotonBuscarArchivoPorContenido.setText("Buscar");
        BotonBuscarArchivoPorContenido.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonBuscarArchivoPorContenidoActionPerformed(evt);
            }
        });

        jLabel3.setText("Busqueda Por Tamaño Más Parecido");

        BotonBuscarPorTamanio.setText("Buscar");
        BotonBuscarPorTamanio.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonBuscarPorTamanioActionPerformed(evt);
            }
        });

        TablaBusqueda.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null}
            },
            new String [] {
                "ID", "Nombre Completo", "Nombre", "Extensión", "Tamaño", "Fecha de Modificación", "Fecha de Creación", "Fecha de última Modificación", "Ruta", "Palabras Claves"
            }
        ));
        jScrollPane4.setViewportView(TablaBusqueda);

        BotonDescargarArchivo.setText("Descargar");
        BotonDescargarArchivo.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonDescargarArchivoActionPerformed(evt);
            }
        });

        BotonPararBusqueda.setText("Parar");
        BotonPararBusqueda.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonPararBusquedaActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel5Layout = new javax.swing.GroupLayout(jPanel5);
        jPanel5.setLayout(jPanel5Layout);
        jPanel5Layout.setHorizontalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addGap(31, 31, 31)
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel5Layout.createSequentialGroup()
                        .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 819, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(BotonDescargarArchivo))
                    .addGroup(jPanel5Layout.createSequentialGroup()
                        .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(TextoBuscarArchivoPorContenido, javax.swing.GroupLayout.PREFERRED_SIZE, 397, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(jLabel2)
                            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel5Layout.createSequentialGroup()
                                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addComponent(TextoBuscarArchivoPorID, javax.swing.GroupLayout.PREFERRED_SIZE, 144, javax.swing.GroupLayout.PREFERRED_SIZE)
                                    .addComponent(jLabel1))
                                .addGap(34, 34, 34)
                                .addComponent(BotonBuscar)
                                .addGap(18, 18, 18)
                                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                                    .addGroup(jPanel5Layout.createSequentialGroup()
                                        .addGap(10, 10, 10)
                                        .addComponent(TextoBuscarPorMasParecido, javax.swing.GroupLayout.PREFERRED_SIZE, 142, javax.swing.GroupLayout.PREFERRED_SIZE))
                                    .addComponent(jLabel3))))
                        .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addGroup(jPanel5Layout.createSequentialGroup()
                                .addGap(17, 17, 17)
                                .addComponent(BotonBuscarArchivoPorContenido)
                                .addGap(58, 58, 58)
                                .addComponent(BotonPararBusqueda))
                            .addGroup(jPanel5Layout.createSequentialGroup()
                                .addGap(37, 37, 37)
                                .addComponent(BotonBuscarPorTamanio)))))
                .addContainerGap(15, Short.MAX_VALUE))
        );
        jPanel5Layout.setVerticalGroup(
            jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel5Layout.createSequentialGroup()
                .addContainerGap()
                .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                    .addComponent(BotonDescargarArchivo)
                    .addGroup(jPanel5Layout.createSequentialGroup()
                        .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(jLabel1)
                            .addComponent(jLabel3))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                            .addComponent(TextoBuscarArchivoPorID, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(TextoBuscarPorMasParecido, javax.swing.GroupLayout.PREFERRED_SIZE, 20, javax.swing.GroupLayout.PREFERRED_SIZE)
                            .addComponent(BotonBuscarPorTamanio)
                            .addComponent(BotonBuscar))
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.TRAILING)
                            .addGroup(jPanel5Layout.createSequentialGroup()
                                .addComponent(jLabel2)
                                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                                .addComponent(TextoBuscarArchivoPorContenido, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE))
                            .addGroup(jPanel5Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                                .addComponent(BotonBuscarArchivoPorContenido)
                                .addComponent(BotonPararBusqueda)))
                        .addGap(31, 31, 31)
                        .addComponent(jScrollPane4, javax.swing.GroupLayout.PREFERRED_SIZE, 97, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(41, Short.MAX_VALUE))
        );

        jTabbedPane1.addTab("Buscar", jPanel5);

        TablaRecursosCompartidos.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null, null, null},
                {null, null, null, null, null, null, null, null, null, null, null, null}
            },
            new String [] {
                "ID", "Nombre Completo", "Nombre", "Extensión", "Tamaño", "Fecha de Modificación", "Fecha de Creación", "Fecha de última Modificación", "Ruta", "Nombre Peer", "Descargar", "Token"
            }
        ));
        jScrollPane6.setViewportView(TablaRecursosCompartidos);

        BotonActualizar.setText("Actualizar");
        BotonActualizar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonActualizarActionPerformed(evt);
            }
        });

        botonSolicitarAbrir.setText("Solicitar y abrir");
        botonSolicitarAbrir.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonSolicitarAbrirActionPerformed(evt);
            }
        });

        botonLiberar.setText("Liberar");
        botonLiberar.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonLiberarActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel3Layout = new javax.swing.GroupLayout(jPanel3);
        jPanel3.setLayout(jPanel3Layout);
        jPanel3Layout.setHorizontalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane6, javax.swing.GroupLayout.PREFERRED_SIZE, 833, javax.swing.GroupLayout.PREFERRED_SIZE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                            .addComponent(botonSolicitarAbrir, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)
                            .addComponent(botonLiberar)))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addGap(21, 21, 21)
                        .addComponent(BotonActualizar)))
                .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE))
        );
        jPanel3Layout.setVerticalGroup(
            jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel3Layout.createSequentialGroup()
                .addGroup(jPanel3Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel3Layout.createSequentialGroup()
                        .addGap(16, 16, 16)
                        .addComponent(jScrollPane6, javax.swing.GroupLayout.DEFAULT_SIZE, 213, Short.MAX_VALUE)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                        .addComponent(BotonActualizar, javax.swing.GroupLayout.PREFERRED_SIZE, 23, javax.swing.GroupLayout.PREFERRED_SIZE))
                    .addGroup(jPanel3Layout.createSequentialGroup()
                        .addGap(39, 39, 39)
                        .addComponent(botonSolicitarAbrir)
                        .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED)
                        .addComponent(botonLiberar)))
                .addContainerGap())
        );

        jTabbedPane1.addTab("Recursos Distribuidos", jPanel3);

        TablaEstadoGlobal.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {

            },
            new String [] {
                "ID", "Nombre Completo", "Nombre", "Extensión", "Ruta", "Nombre Peer", "Descargas", "Token"
            }
        ));
        jScrollPane7.setViewportView(TablaEstadoGlobal);
        TablaEstadoGlobal.getColumnModel().getColumn(5).setResizable(false);
        TablaEstadoGlobal.getColumnModel().getColumn(6).setResizable(false);

        botonEstadoGlobal.setText("Guardar  Estado Global");
        botonEstadoGlobal.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                botonEstadoGlobalActionPerformed(evt);
            }
        });

        BotonActualizarEstado.setText("Actualizar");
        BotonActualizarEstado.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                BotonActualizarEstadoActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout jPanel6Layout = new javax.swing.GroupLayout(jPanel6);
        jPanel6.setLayout(jPanel6Layout);
        jPanel6Layout.setHorizontalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(jPanel6Layout.createSequentialGroup()
                .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(jPanel6Layout.createSequentialGroup()
                        .addGap(321, 321, 321)
                        .addComponent(botonEstadoGlobal)
                        .addGap(134, 134, 134)
                        .addComponent(BotonActualizarEstado))
                    .addGroup(jPanel6Layout.createSequentialGroup()
                        .addContainerGap()
                        .addComponent(jScrollPane7, javax.swing.GroupLayout.PREFERRED_SIZE, 833, javax.swing.GroupLayout.PREFERRED_SIZE)))
                .addContainerGap(115, Short.MAX_VALUE))
        );
        jPanel6Layout.setVerticalGroup(
            jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(javax.swing.GroupLayout.Alignment.TRAILING, jPanel6Layout.createSequentialGroup()
                .addGap(20, 20, 20)
                .addComponent(jScrollPane7, javax.swing.GroupLayout.DEFAULT_SIZE, 209, Short.MAX_VALUE)
                .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED)
                .addGroup(jPanel6Layout.createParallelGroup(javax.swing.GroupLayout.Alignment.BASELINE)
                    .addComponent(botonEstadoGlobal)
                    .addComponent(BotonActualizarEstado))
                .addGap(11, 11, 11))
        );

        jTabbedPane1.addTab("Estado Proceso", jPanel6);

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 963, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(29, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addContainerGap()
                .addComponent(jTabbedPane1, javax.swing.GroupLayout.PREFERRED_SIZE, 294, javax.swing.GroupLayout.PREFERRED_SIZE)
                .addContainerGap(34, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>//GEN-END:initComponents

    private void botonEstadoGlobalActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonEstadoGlobalActionPerformed
        ManagerJXTA.estadoGlobal.setColor("ROJO");       
    }//GEN-LAST:event_botonEstadoGlobalActionPerformed
  private void estadoLocal()
    {
        DefaultTableModel modelo = (DefaultTableModel) this.TablaEstadoGlobal.getModel(); // para manipular el objeto en un modelo

      //  modelo.setRowCount(0); // para vaciar el contenido de la tabla
        if (!recursosCompartidos.isEmpty()) {
            for (int i = 0; i < recursosCompartidos.size(); i++) {

                Atributo a = new Atributo();

                a = recursosCompartidos.get(i);

                String id =  a.getId();
                String nombreCompleto = a.getNombreCompleto();
                String nombre = a.getNombre();
                String extension = a.getExt();
                String ruta = a.getNombreCompleto();
                String propietario = a.getNombrePeer();
                int descargas = a.getDescargas();
                String token = "ok"; //tieneToken(a.getId());

                Object nuevo[] = {id, nombreCompleto, nombre, extension, ruta,propietario,descargas,token};
                modelo.addRow(nuevo);

                System.out.println("Actualizando properties");
            }
        }
     }

    private void botonLiberarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonLiberarActionPerformed

        String idDocumento = null;
        int rowNum;
        String estado= null;

        String ruta = null;

        if ((rowNum = this.TablaRecursosCompartidos.getSelectedRow()) != -1) {
            idDocumento = TablaRecursosCompartidos.getValueAt(rowNum,0).toString();
            ruta = TablaRecursosCompartidos.getValueAt(rowNum,1).toString();
            estado= (String)TablaRecursosCompartidos.getValueAt(rowNum,10);
        }

        if (estado==null) {
            JOptionPane.showMessageDialog(null, new JLabel("El documento no se ha solicitado"));

        } else{
            try {
                Token token = traerToken(idDocumento);
                jxta.releaseCS(token, ruta);
                TablaRecursosCompartidos.setValueAt(null, rowNum, 10);
            } catch (IOException ex) {
                JOptionPane.showInternalConfirmDialog(this, "Error al intentar liberar el objeto");
                Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
            }

        }





    }//GEN-LAST:event_botonLiberarActionPerformed

    private void botonSolicitarAbrirActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_botonSolicitarAbrirActionPerformed

    if(jxta.estadoGlobal.getColor().equals("ROJO"))
      {
         jxta.publicarConsulta("estado", ConsultaAdvertisement.ESTADO);
      }

        String idDocumento = null;
        String archivo = null;
        final int rowNum;
        String estado= null;
        String destino=null;

        try {

            if ((rowNum = this.TablaRecursosCompartidos.getSelectedRow()) != -1) {
                idDocumento = TablaRecursosCompartidos.getValueAt(rowNum,0).toString();
                estado= (String)TablaRecursosCompartidos.getValueAt(rowNum,10);
                destino = (String)TablaRecursosCompartidos.getValueAt(rowNum,9).toString();
            }

            String n=  devolverNombrePeer( idDocumento);
            recursosCompartidos.get(rowNum).agregarDescarga();
       //     CrearInputPipe.getResultados().get(rowNum).agregarDescarga();
            
            if (estado==null) {
                TablaRecursosCompartidos.setValueAt((Object)"Solicitando...", rowNum, 10);
                // JOptionPane.showMessageDialog(null, new JLabel("Mensaje "+archivo));
                jxta.requestCS(idDocumento,nombrePeer,destino, new TokenListener() {

                    public void gestionarToken(Token token) {
                        TablaRecursosCompartidos.setValueAt((Object)"Descargando...", rowNum, 10);

                        asignandoToken(token,token.getIdDocumento());

                        int secuencia = token.getNumeroSecuenciaNodo();
                        String nodoOrigen = traerNodo(token.getIdDocumento());
                        String mensaje = "Envía Token del documento:"+token.getIdDocumento();
                        String color=token.getColor();

                        TablaRecursosCompartidos.setValueAt((Object)"Modificando...", rowNum, 10);
                        jxta.recibirMensaje(secuencia,nodoOrigen,mensaje,color);
                        String nombreArchivo = traerRutaArchivo(token.getIdDocumento());
                        jxta.traerArchivo(token.getIdDocumento(), RUTA_EM, token.getPropietarioDescarga(),nombreArchivo);

                        //  ArrayList<Atributo> consulta = manager.Consulta(ConsultaAdvertisement.QUERY_POR_ID, token.getIdDocumento(), nombrePeer);
                        //Erro de NULL POINTER EXCEPTION BORRAR CUANDO SE CORRIJA.






                        ApplicationLauncher abc = new ApplicationLauncher(RUTA_EM+nombreArchivo);
                    }

                    private void asignandoToken(Token token, String idDocumento) {
                        for(Atributo a : recursosCompartidos) {
                            String id = a.getId();
                            if(id.equals(idDocumento)){
                                a.setTokenCS(token);
                            }
                        }
                    }

                    private String traerRutaArchivo(String idDocumento) {

                        String ruta = null;
                        for(Atributo a : recursosCompartidos) {
                            String id = a.getId();
                            if(id.equals(idDocumento)){
                                ruta = a.getNombreCompleto();
                                break;
                            }
                        }
                        return ruta;
                    }


                });

                actualizarMensajes();

                //           JOptionPane.showMessageDialog(null, new JLabel("Mensaje "+idDocumento));
                //          JOptionPane.showMessageDialog(null, new JLabel("El archivo está  "+archivo));
            } else {
                if (estado.equals("Solicitando...")) {
                    JOptionPane.showMessageDialog(null, new JLabel("El archivo se está solicitando  " + archivo));
                } else {
                    JOptionPane.showMessageDialog(null, new JLabel("El archivo se está modificando" + archivo));
                }
            }






        } catch (IOException ex) {
            Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
            JOptionPane.showMessageDialog(this, "Error en la solicitud de la seccion critica "
                    + "con id " + idDocumento);
            ex.printStackTrace();
        }



    }//GEN-LAST:event_botonSolicitarAbrirActionPerformed

    private void BotonActualizarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonActualizarActionPerformed

        //     this.BotonActualizar.setEnabled(false);

        String query = "*";
        jxta.publicarConsulta(query, ConsultaAdvertisement.QUERY_POR_TODOS);



        recursosCompartidos = CrearInputPipe.getResultados();

        cargarArchivosCompartidos();

        jxta.cargarNodos(nodos);
        //   cargarResultados();

        //Crea todos los sistemas de Exclusion Mutua para los archivos encontrados
        cargarArchivosCompartidosEM();
        jxta.escucharConsultas();
        //      this.BotonActualizar.setEnabled(true);

    }//GEN-LAST:event_BotonActualizarActionPerformed

    private void BotonPararBusquedaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonPararBusquedaActionPerformed


        resultados = CrearInputPipe.getResultados();

        //        RespuestaQuery pararConsulta = jxta.pararConsulta();
        //
        //        Set<PipeAdvertisement> obtenerPipes = pararConsulta.obtenerPipes();
        //
        //        for (PipeAdvertisement pipe : obtenerPipes) {
        //            List<Atributo> obtenerAtributos = pararConsulta.obtenerAtributos(pipe);
        //            for (Atributo att : obtenerAtributos) {
        //                att.setPipe(pipe);
        //                resultados.add(att);
        //            }
        //        }
        cargarResultados();
        jxta.escucharConsultas();
    }//GEN-LAST:event_BotonPararBusquedaActionPerformed

    private void BotonDescargarArchivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonDescargarArchivoActionPerformed
        // TODO add your handling code here:

        int rowNum;
        String id = null;
        PipeAdvertisement pipe;
        String extension = null;
        String ruta = null;
        if ((rowNum = this.TablaBusqueda.getSelectedRow()) != -1) {
            id = TablaBusqueda.getValueAt(rowNum, 0).toString();
        }

        for (Atributo a : resultados) {
            if (a.getId().equals(id)) {
                pipe = a.getPipe();
                extension = a.getExt();
                break;            }
        }
        // audio mp3, wav,wma
        // video mpg, avi, mpeg
        // texto pdf, doc, docx, txt

        if (extension.equals("mp3") || extension.equals("wav") || extension.equals("wma")) {
            ruta = this.RUTA_AUDIO;
        } else if (extension.equals("mpg") || extension.equals("avi") || extension.equals("mpeg")) {
            ruta = this.RUTA_VIDEO;
        } else if (extension.equals("pdf") || extension.equals("doc") || extension.equals("docx") || extension.equals("txt")) {
            ruta = this.RUTA_TEXTO;
        }




        this.jxta.descargarArchivo(id, ruta);


    }//GEN-LAST:event_BotonDescargarArchivoActionPerformed

    private void BotonBuscarPorTamanioActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonBuscarPorTamanioActionPerformed
        String query = TextoBuscarPorMasParecido.getText();
        //        resultados.clear();
        //        resultados = manager.Consulta(3, query);
        //        cargarResultados();


        jxta.publicarConsulta(query, ConsultaAdvertisement.QUERY_POR_KPARECIDOS);        // TODO add your handling code here:
}//GEN-LAST:event_BotonBuscarPorTamanioActionPerformed

    private void BotonBuscarArchivoPorContenidoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonBuscarArchivoPorContenidoActionPerformed
        String query = TextoBuscarArchivoPorContenido.getText();
        jxta.publicarConsulta(query, ConsultaAdvertisement.QUERY_POR_KEYWORDS);
        //        resultados.clear();
        //        resultados = manager.Consulta(2, query);
        //        cargarResultados();
}//GEN-LAST:event_BotonBuscarArchivoPorContenidoActionPerformed

    private void BotonBuscarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonBuscarActionPerformed
        String query = TextoBuscarArchivoPorID.getText();
        jxta.publicarConsulta(query, ConsultaAdvertisement.QUERY_POR_ID);
}//GEN-LAST:event_BotonBuscarActionPerformed

    private void BotonStopActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonStopActionPerformed
        //        Vector vct;
        //        vct = jxta.peerList;
        //        jxta.setEndOfSearch(true);
        //        int b;
        //        this.TextPeer.setText(null);
        //        for (int i = 0; i < vct.size(); i++) {
        //            b = i + 1;
        //            this.TextPeer.append("Peer no " + b + " " + vct.elementAt(i) + "\n");
        //        }
        //
        //        this.TextLog.append("paró la busqueda \n");
}//GEN-LAST:event_BotonStopActionPerformed

    private void BotonBuscarPeerActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonBuscarPeerActionPerformed
        this.TextPeer.setText("");

        mostrarPeer();
        //   jxta.buscarPeer();

        //        this.TextLog.setText("estamos buscando " + jxta.getTextLog());
}//GEN-LAST:event_BotonBuscarPeerActionPerformed

    private void BottonEditarTablaActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BottonEditarTablaActionPerformed
        // TODO add your handling code here:
        this.pararCargadeArchivos(); //al final del hilo se habilita la opción de editar la tabla
    }//GEN-LAST:event_BottonEditarTablaActionPerformed

    private void BotonAbrirArchivoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonAbrirArchivoActionPerformed
        // TODO add your handling code here:

        int rowNum;
        String archivo = null;
        if ((rowNum = this.TablaArchivos.getSelectedRow()) != -1) {
            archivo = TablaArchivos.getValueAt(rowNum, 8).toString();
        }

        ApplicationLauncher abc = new ApplicationLauncher(archivo);
}//GEN-LAST:event_BotonAbrirArchivoActionPerformed

    private void BotonGuardarCambiosActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonGuardarCambiosActionPerformed

        try {
            // TODO add your handling code here:
            //  (new Thread(this)).stop();
            this.TablaArchivos.setEnabled(false);
            DefaultTableModel modelo = (DefaultTableModel) this.TablaArchivos.getModel(); // para manipular el objeto en un modelo
            //  modelo.setRowCount(0) ; // para vaciar el contenido de la tabla
            // listarArchivos(path, modelo);

            System.out.println("kkkkkkk" + modelo.getValueAt(1, 0).toString());
            //
            int largo = modelo.getRowCount();
            propiedades.clear();
            for (int i = 0; i < largo; i++) {
                Atributo at = new Atributo();
                String id = modelo.getValueAt(i, 0).toString();
                String nombre = modelo.getValueAt(i, 1).toString();
                String nombreCompleto = modelo.getValueAt(i, 2).toString();
                String ext = modelo.getValueAt(i, 3).toString();
                String tamanio = modelo.getValueAt(i, 4).toString();
                String fechaModificacion = modelo.getValueAt(i, 5).toString();
                String fechaCreacion = modelo.getValueAt(i, 6).toString();
                String fechaAcceso = modelo.getValueAt(i, 7).toString();
                String index = modelo.getValueAt(i, 8).toString();
                String palabrasClave = modelo.getValueAt(i, 9).toString();
                at.setId(id);
                at.setNombre(nombre);
                at.setNombreCompleto(nombreCompleto);
                at.setExt(ext);
                at.setTamanio(tamanio);
                at.setFechaModificacion(fechaModificacion);
                at.setFechaCreacion(fechaCreacion);
                at.setFechaAcceso(fechaAcceso);
                at.setIndex(index);
                at.setPalabrasClave(palabrasClave);
                propiedades.add(at);
            }

            manager.setAtribSistArc(propiedades);
            try {
                manager.actualizarArchivos2();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
            }
            modelo.setRowCount(0);
            try {
                this.iniciarCargadeArchivos();
            } catch (FileNotFoundException ex) {
                Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
            } catch (ClassNotFoundException ex) {
                Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
            }


            this.TablaArchivos.setEnabled(false);
            this.BotonGuardarCambios.setEnabled(false);
            this.BotonAbrirArchivo.setEnabled(false);
            //listarArchivos(path, modelo);
            this.BottonEditarTabla.setEnabled(true);
        } catch (IOException ex) {
            Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
        }




    }//GEN-LAST:event_BotonGuardarCambiosActionPerformed

    private void TablaArchivosKeyPressed(java.awt.event.KeyEvent evt) {//GEN-FIRST:event_TablaArchivosKeyPressed

}//GEN-LAST:event_TablaArchivosKeyPressed

    private void TablaArchivosInputMethodTextChanged(java.awt.event.InputMethodEvent evt) {//GEN-FIRST:event_TablaArchivosInputMethodTextChanged

}//GEN-LAST:event_TablaArchivosInputMethodTextChanged

    private void TablaArchivosFocusGained(java.awt.event.FocusEvent evt) {//GEN-FIRST:event_TablaArchivosFocusGained

}//GEN-LAST:event_TablaArchivosFocusGained

    private void TablaArchivosMouseEntered(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_TablaArchivosMouseEntered
        // TODO add your handling code here:
}//GEN-LAST:event_TablaArchivosMouseEntered

    private void TablaArchivosMouseClicked(java.awt.event.MouseEvent evt) {//GEN-FIRST:event_TablaArchivosMouseClicked

}//GEN-LAST:event_TablaArchivosMouseClicked

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_jButton1ActionPerformed
        // TODO add your handling code here:
}//GEN-LAST:event_jButton1ActionPerformed

    private void BotonIniciarActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonIniciarActionPerformed
        try {
            // TODO add your handling code here:
            this.TextLog.append("Iniciando Jxta \n");
            nombrePeer = this.TextoNombrePeer.getText();
            nombreInstancia = this.TextoNombrePeer.getText();
            this.jxta = new ManagerJXTA(ConfigMode.ADHOC, nombreInstancia, nombrePeer);
            jxta.setCarpetaCompartida(PATH);
            //Inicializa la clase que maneja los mensajes de exclusion mutua.
            jxta.initializeEMJxta();


            //jxta.servirArchivos();
            // iniciando scand del directorio
            manager = new ManagerAtributos(PATH);
            this.TextLog.append("Cargando directorio");
            this.TextLog.append("Jxta iniciado \n");
            //Para borrar la tabla
            DefaultTableModel modelo = (DefaultTableModel) this.TablaArchivos.getModel();
            modelo.setRowCount(0);
            // iniciando el hilo de verificación
            jxta.escucharConsultas();
            jxta.servirArchivos();
            jxta.escucharObjetosDevueltosEM();
            //Comienza la escucha de peticiones de seccion critica
            (new Thread(this)).start();

        } catch (FileNotFoundException ex) {
            Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
        } catch (ClassNotFoundException ex) {
            Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
        } catch (IOException ex) {
            Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
        }
}//GEN-LAST:event_BotonIniciarActionPerformed

    private void BotonActualizarEstadoActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_BotonActualizarEstadoActionPerformed
        estadoLocal();
        estadoRemoto();


    }//GEN-LAST:event_BotonActualizarEstadoActionPerformed
    private Token traerToken(String idDocumento) {
        Token t = null;
        for (Atributo a : recursosCompartidos) {
            String id = a.getId();
            if (id.equals(idDocumento)) {
                t = a.getTokenCS();
            }
        }
        return t;
    }


    private void listarArchivos(String path, DefaultTableModel modelo) {


        File dir = new File(path);
        File[] listOfFiles = dir.listFiles();

        int NumOfFiles = 0;

        for (int i = 0; i < listOfFiles.length; i++) {
            if (listOfFiles[i].isDirectory()) {
                listarArchivos(listOfFiles[i].getAbsolutePath(), modelo);
            } else {
                //       prop.getProperty(null, null)
                //              prop.load(listOfFiles[i].toURL().openStream()); // Cargo propiedades

                int punto = listOfFiles[i].getName().lastIndexOf(".", listOfFiles[i].getName().toString().length()) + 1;
                int largo = listOfFiles[i].getName().toString().length();
                String tipo = listOfFiles[i].getName().substring(punto, largo);

                int barra = listOfFiles[i].getParent().toString().lastIndexOf("\\", listOfFiles[i].getParent().toString().length()) + 1;
                largo = listOfFiles[i].getParent().toString().length();
                String carpeta = listOfFiles[i].getParent().substring(barra, largo);

                String nombre = listOfFiles[i].getName();
                long tamanio = listOfFiles[i].length();
                long fechaMod = listOfFiles[i].lastModified();
                //   long fechCre = listOfFiles[i].get




                String fechaModifiacion = new SimpleDateFormat("yyyy-MM-dd").format(fechaMod);
                Object nuevo[] = {carpeta, nombre, tipo, tamanio, fechaModifiacion};
                modelo.addRow(nuevo);

            }


        }


    }

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {


        java.awt.EventQueue.invokeLater(new Runnable() {

            public void run() {

                new Inicio().setVisible(true);
            }
        });


    }
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JButton BotonAbrirArchivo;
    private javax.swing.JButton BotonActualizar;
    private javax.swing.JButton BotonActualizarEstado;
    private javax.swing.JButton BotonBuscar;
    private javax.swing.JButton BotonBuscarArchivoPorContenido;
    private javax.swing.JButton BotonBuscarPeer;
    private javax.swing.JButton BotonBuscarPorTamanio;
    private javax.swing.JButton BotonDescargarArchivo;
    private javax.swing.JButton BotonGuardarCambios;
    private javax.swing.JButton BotonIniciar;
    private javax.swing.JButton BotonPararBusqueda;
    private javax.swing.JButton BotonStop;
    private javax.swing.JButton BottonEditarTabla;
    private javax.swing.JTable TablaArchivos;
    private javax.swing.JTable TablaBusqueda;
    private javax.swing.JTable TablaEstadoGlobal;
    private javax.swing.JTable TablaRecursosCompartidos;
    private javax.swing.JTextArea TextLog;
    private javax.swing.JTextArea TextPeer;
    private javax.swing.JTextField TextoBuscarArchivoPorContenido;
    private javax.swing.JTextField TextoBuscarArchivoPorID;
    private javax.swing.JTextField TextoBuscarPorMasParecido;
    private javax.swing.JTextField TextoNombrePeer;
    private javax.swing.JButton botonEstadoGlobal;
    private javax.swing.JButton botonLiberar;
    private javax.swing.JButton botonSolicitarAbrir;
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    private javax.swing.JLabel jLabel2;
    private javax.swing.JLabel jLabel3;
    private javax.swing.JLabel jLabel4;
    private javax.swing.JPanel jPanel1;
    private javax.swing.JPanel jPanel2;
    private javax.swing.JPanel jPanel3;
    private javax.swing.JPanel jPanel4;
    private javax.swing.JPanel jPanel5;
    private javax.swing.JPanel jPanel6;
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JScrollPane jScrollPane2;
    private javax.swing.JScrollPane jScrollPane3;
    private javax.swing.JScrollPane jScrollPane4;
    private javax.swing.JScrollPane jScrollPane5;
    private javax.swing.JScrollPane jScrollPane6;
    private javax.swing.JScrollPane jScrollPane7;
    private javax.swing.JTabbedPane jTabbedPane1;
    private javax.swing.JTextArea jTextArea1;
    // End of variables declaration//GEN-END:variables

    public void run() {
        mostrarDatosTabla();
    }

    private boolean estadodirectorio() {

        return estadoDir;
    }

    private void pararCargadeArchivos() {
        estadoDir = true;


    }

    private void iniciarCargadeArchivos() throws IOException, FileNotFoundException, ClassNotFoundException {
        manager = null;
        manager = new ManagerAtributos(PATH);
        estadoDir = false;
        //actualizar archivos y luego actualiza los properties
        DefaultTableModel modelo = (DefaultTableModel) this.TablaArchivos.getModel(); // para manipular el objeto en un modelo
        modelo.setRowCount(0);
        (new Thread(this)).start();
    }

    public void mostrarDatosTabla() {

//        while (!estadodirectorio())
        {
            try {
                this.cargarDatos();
                Thread.sleep(TIMEOUT);
                DefaultTableModel modelo = (DefaultTableModel) this.TablaArchivos.getModel(); // para manipular el objeto en un modelo
                modelo.setRowCount(0); // para vaciar el contenido de la tabla

            } catch (InterruptedException ex) {
                Logger.getLogger(Inicio.class.getName()).log(Level.SEVERE, null, ex);
            }
        }

        this.TablaArchivos.setEnabled(true); //si para la carga de datos quiere decir que puede modificar
        this.BotonGuardarCambios.setEnabled(true);
        this.BottonEditarTabla.setEnabled(false);
        this.BotonAbrirArchivo.setEnabled(true);
        this.cargarDatos();
    }

    private void cargarDatos() {
        DefaultTableModel modelo = (DefaultTableModel) this.TablaArchivos.getModel(); // para manipular el objeto en un modelo
        propiedades = manager.getAtribSistArc();

        System.out.println("cargando... Numero de archivos:" + propiedades.size());
        for (int i = 0; i < propiedades.size(); i++) {

            Atributo propiedad = propiedades.get(i);

            String id = propiedad.getId();
            String nombreCompleto = propiedad.getNombreCompleto();
            String nombre = propiedad.getNombre();
            String ext = propiedad.getExt();
            String tamanio = propiedad.getTamanio();
            String fechaModificacion = propiedad.getFechaModificacion();
            String fechaCreación = propiedad.getFechaCreacion();
            String fechaAcceso = propiedad.getFechaAcceso();
            String index = propiedad.getIndex();
            String palabrasClaves = propiedad.getPalabrasClave();

            Object nuevo[] = {id, nombreCompleto, nombre, ext, tamanio, fechaModificacion, fechaCreación, fechaAcceso, index, palabrasClaves};
            modelo.addRow(nuevo);


        }
        System.out.println("Archivos Cargados");
    }

    private void cargarResultados() {
        DefaultTableModel modelo = (DefaultTableModel) this.TablaBusqueda.getModel(); // para manipular el objeto en un modelo
        modelo.setRowCount(0); // para vaciar el contenido de la tabla
        if (recursosCompartidos != null) {
            for (int i = 0; i < resultados.size(); i++) {

                Atributo propiedad = resultados.get(i);

                String id = propiedad.getId();
                String nombreCompleto = propiedad.getNombreCompleto();
                String nombre = propiedad.getNombre();
                String ext = propiedad.getExt();
                String tamanio = propiedad.getTamanio();
                String fechaModificacion = propiedad.getFechaModificacion();
                String fechaCreación = propiedad.getFechaCreacion();
                String fechaAcceso = propiedad.getFechaAcceso();
                String index = propiedad.getIndex();
                String palabrasClaves = propiedad.getPalabrasClave();

                Object nuevo[] = {id, nombreCompleto, nombre, ext, tamanio, fechaModificacion, fechaCreación, fechaAcceso, index, palabrasClaves};
                modelo.addRow(nuevo);

                System.out.println("Actualizando properties");
            }
        }
    }

    private void cargarArchivosCompartidos() {
        DefaultTableModel modelo = (DefaultTableModel) this.TablaRecursosCompartidos.getModel(); // para manipular el objeto en un modelo
        modelo.setRowCount(0); // para vaciar el contenido de la tabla
        //System.out.println("d" + recursosCompartidos.size());


        nodos.clear();


        if (!recursosCompartidos.isEmpty()) {
               // Se adiciona el primero nodo
                Nodos n = new Nodos();
                n.setNombre(recursosCompartidos.get(0).getNombrePeer());
                n.setSecuencia(1);
                nodos.add(n);
             
            for (int i = 0; i < recursosCompartidos.size(); i++) {

                Atributo propiedad = recursosCompartidos.get(i);

                String id = propiedad.getId();
                String nombreCompleto = propiedad.getNombreCompleto();
                String nombre = propiedad.getNombre();
                String ext = propiedad.getExt();
                String tamanio = propiedad.getTamanio();
                String fechaModificacion = propiedad.getFechaModificacion();
                String fechaCreación = propiedad.getFechaCreacion();
                String fechaAcceso = propiedad.getFechaAcceso();
                String index = propiedad.getIndex();
                String nombrePeerRemoto = propiedad.getNombrePeer();
       /**/

                cargarNodo(nombrePeerRemoto); // solo se cargar los que son remotos

                Object nuevo[] = {id, nombreCompleto,
                nombre, ext, tamanio,
                fechaModificacion, fechaCreación,
                fechaAcceso, index,
                nombrePeerRemoto


                //,new JButton("Abrir"),new JButton("Liberar")

                };
                modelo.addRow(nuevo);

                System.out.println("Actualizando properties");
            }
        }
        else
        {
            System.out.println("no devolvió resultados la busqueda");
        }

        if (!propiedades.isEmpty()) {
            for (int i = 0; i < propiedades.size(); i++) {

                Atributo propiedad = propiedades.get(i);

                String id = propiedad.getId();
                String nombreCompleto = propiedad.getNombreCompleto();
                String nombre = propiedad.getNombre();
                String ext = propiedad.getExt();
                String tamanio = propiedad.getTamanio();
                String fechaModificacion = propiedad.getFechaModificacion();
                String fechaCreación = propiedad.getFechaCreacion();
                String fechaAcceso = propiedad.getFechaAcceso();
                String index = propiedad.getIndex();
                String nombrePeerRemoto = this.nombrePeer;

                Object nuevo[] = {id, nombreCompleto,
                nombre, ext, tamanio,
                fechaModificacion, fechaCreación,
                fechaAcceso, index,
                nombrePeerRemoto
//                        ,new JButton("Abrir"),new JButton("Liberar")
                };
                modelo.addRow(nuevo);
                recursosCompartidos.add(propiedad);
                System.out.println("Actualizando properties");
            }
        }
    }

    /**
     * Metodo que carga los recursos criticos en el sistema de Exclusión Mutua
     * de este nodo. También carga en el sistema de exclusión mutua los archivos
     * que le pertenecen a este nodo.
     * 
     */
    private void cargarArchivosCompartidosEM() {

        //Creando los sistemas de exlcusión mutua con los archivos que estan
        //en este nodo.
        System.out.println("====================EXCLUSIÓN MUTUA=======================");
        System.out.println("==========CARGANDO LOS OBJETOS DE ESTE NODO===============");
        List<Atributo> misArchivos = manager.Consulta(ConsultaAdvertisement.QUERY_POR_TODOS, "*",nombrePeer);
        for (int i = 0; i < misArchivos.size(); i++) {
            Atributo att = misArchivos.get(i);
            String idRecursoCritico = att.getId();
            String nodoOrigen = att.getNombrePeer();
            jxta.addRecursoCritico(idRecursoCritico,true,nodoOrigen);
        }
        
        //Se obtienen los resultados
        Map<PipeAdvertisement, List<Atributo>> resultadosMap
                = CrearInputPipe.resultadosMap;

        System.out.println("====================EXCLUSIÓN MUTUA=======================");
        System.out.println("==========CARGANDO LOS OBJETOS DE OTROS NODOS=============");
        //Creando los sistemas de exlcusión mutua con los archivos que estan
        //en los otros nodos.
        if (resultadosMap != null) {
            for(Map.Entry<PipeAdvertisement,List<Atributo>> entrySet : resultadosMap.entrySet()){
                for(Atributo att : entrySet.getValue()){
                    String nodoOrigen = att.getNombrePeer();
                    jxta.addRecursoCritico(att.getId(),nodoOrigen);
                }
            }//End for EntrySet

            //Cargando los peers encontrados en los sistemas de exclusión mutua
            //creados anteriormente
            for(PipeAdvertisement pipeRemoto : resultadosMap.keySet()){
                jxta.addPeerRemotoEM(pipeRemoto);
            }

            //Añadiendo este peer al sistema de exclusión mutua
            jxta.addThisPeerEM();
        }//End if
    }
 private String traerNodo(String idDocumento) {

     String nodo = null;
     if (recursosCompartidos != null) {
         for (int i = 0; i < recursosCompartidos.size(); i++) {
             Atributo propiedad = recursosCompartidos.get(i);

             if (propiedad.getId().equals(idDocumento)) {
                 nodo = propiedad.getNombrePeer();
                 break;
             }

         }
     }
        if (propiedades != null) {
            for (int i = 0; i < propiedades.size(); i++) {

                Atributo propiedad = propiedades.get(i);

                   if(propiedad.getId().equals(idDocumento)) {
                      nodo = propiedad.getNombrePeer();
                      break;
                   }

                }
            }

        return nodo;
    }

    private void cargarListaNodos() {


        Nodos primero = new Nodos();
        String nombre = null;


            nodos.clear();

        for(Map.Entry<PipeAdvertisement, List<Atributo>> entry : CrearInputPipe.resultadosMap.entrySet()){
            String nombreNodo = entry.getValue().get(1).getNombrePeer();
            primero.setNombre(nombreNodo);
            primero.setSecuencia(1);
            nodos.add(primero);

        }
        

        
    }

    private void actualizarMensajes() {
       cargarEnviados();
       cargarRecibidos();
    }

    private void cargarEnviados() {
//        DefaultTableModel modelo = (DefaultTableModel) this.TablaMensajesEnviados.getModel(); // para manipular el objeto en un modelo
//            modelo.setRowCount(0);
//       if(ManagerJXTA.historiaMensajes.getEnviados()!=null)
//        for (int i = 0; i < ManagerJXTA.historiaMensajes.getEnviados().size(); i++) {
//
//            Mensajes mensaje =  ManagerJXTA.historiaMensajes.getEnviados().get(i);
//
//            int id = mensaje.getId();
//            String origen = mensaje.getOrigen();
//            String destino = mensaje.getDestino();
//            String msg  =  mensaje.getMensaje();
//            String color = mensaje.getColor();
//
//            Object nuevo[] = {id, origen, destino, msg, color};
//            modelo.addRow(nuevo);
//        }
//        System.out.println("Archivos Cargados");
  }

    private void cargarRecibidos() {
//        DefaultTableModel modelo = (DefaultTableModel) this.TablaMensajesRecibidos.getModel(); // para manipular el objeto en un modelo
//        modelo.setRowCount(0);
//       if(ManagerJXTA.historiaMensajes.getRecibidos()!=null)
//        for (int i = 0; i < ManagerJXTA.historiaMensajes.getRecibidos().size(); i++) {
//
//            Mensajes mensaje =  ManagerJXTA.historiaMensajes.getRecibidos().get(i);
//
//            int id = mensaje.getId();
//            String origen = mensaje.getOrigen();
//            String destino = mensaje.getDestino();
//            String msg  =  mensaje.getMensaje();
//            String color = mensaje.getColor();
//
//            Object nuevo[] = {id, origen, destino, msg, color};
//            modelo.addRow(nuevo);
//        }
//        System.out.println("Archivos Cargados");
    }

    private void cargarNodo(String nombrePeerRemoto) {
   boolean existeNodo = false;

        for(Nodos n : nodos)
            {
             
             String nombre = n.getNombre();

                if(nombre.equals(nombrePeerRemoto))
                {
                    existeNodo = true;
                    break;
                }
            }
       if(!existeNodo)
       {
            Nodos no = new Nodos();
            no.setNombre(nombrePeerRemoto);
            no.setSecuencia(1);
            nodos.add(no);
       }



    }

    private void mostrarPeer() {

        String cadena="";
        for(Nodos n : nodos)
        {
          cadena = cadena + n.getNombre() + "\n";
        }
          this.TextPeer.setText(cadena);
    }
    
    public static String devolverNombrePeer(String idDocumentos)
     {
        String nombre=null;


        if(recursosCompartidos!=null)
          for(Atributo a: recursosCompartidos)
            {
                String id= a.getId();

                if(id.equals(idDocumentos))
                {
                    nombre = a.getNombrePeer();
                    break;
                }
            }
        return nombre;
     }

    private String tieneToken(String id) {
        throw new UnsupportedOperationException("Not yet implemented");
    }

    private void estadoRemoto() {
           DefaultTableModel modelo = (DefaultTableModel) this.TablaEstadoGlobal.getModel(); // para manipular el objeto en un modelo

      //  modelo.setRowCount(0); // para vaciar el contenido de la tabla
        if (!CrearInputPipe.resultadosEstados.isEmpty()) {
            for (int i = 0; i < CrearInputPipe.resultadosEstados.size(); i++) {

                Atributo a = new Atributo();

                a = CrearInputPipe.resultadosEstados.get(i);

                String id =  a.getId();
                String nombreCompleto = a.getNombreCompleto();
                String nombre = a.getNombre();
                String extension = a.getExt();
                String ruta = a.getNombreCompleto();
                String propietario = a.getNombrePeer();
                int descargas = a.getDescargas();
                String token = "ok"; //tieneToken(a.getId());

                Object nuevo[] = {id, nombreCompleto, nombre, extension, ruta,propietario,descargas,token};
                modelo.addRow(nuevo);

                System.out.println("Actualizando properties");
            }
        }
    }



}
